#include <iostream>
#include <string>
#include <cerrno>
#include <cassert>
#include <string.h>
#include <sys/types.h>
#include <unistd.h>

using namespace std;
int main()
{
    // 任何一种任何一种进程间通信中，一定要 先 保证不同的进程之间看到同一份资源
    int pipefd[2] = {0};
    //1. 创建管道
    int n = pipe(pipefd);
    if(n < 0)
    {
        cout << "pipe error, " << errno << ": " << strerror(errno) << endl;
        return 1;
    }
    //2. 创建子进程
    pid_t id = fork();
    assert(id != -1); //意料之外用if，意料之中用assert

    if(id == 0)// 子进程
    {
        //3. 关闭不需要的fd，让父进程进行写入，让子进程进行读取
        close(pipefd[1]);

        //4. 开始通信 -- 结合某种场景
        while(true)
        {
            char buffer[1024];
            int n= read(pipefd[0], buffer, sizeof(buffer)-1);
            if(n>0)
            {
                buffer[n] = '\0';
                cout << "我是子进程, father give me message: " << buffer << endl;
            }
            else if(n==0) break;
            else break;
            sleep(1);
        }
        close(pipefd[0]);
        exit(0);
    }

    //父进程
    //3. 关闭不需要的fd，让父进程进行读取，让子进程进行写入
    close(pipefd[0]);

    //4. 开始通信 -- 结合某种场景
    int cnt=3;
    while(cnt--)
    {
        const char *msg="I am father";
        write(pipefd[1] , msg , strlen(msg));
        sleep(1);
    }
    

    close(pipefd[1]);


    sleep(5);

    return 0;
}